AWS Step FunctionsでPayloadサイズ上限256KBを超えた際の挙動を確認してみた
こんにちは、CX事業本部 IoT事業部の若槻です。
AWS Step Functionsでは、State間の遷移で渡すことのできるPayloadサイズは最大256KBという制限があります。
AWSコンソールでサービスクォータを見ると確かにそのようになっています。
The maximum input or result data size in bytes as a UTF-8 encoded string for a task, state, or execution. AWS default quota value 262,144 bytes
今回は、AWS Step FunctionsでPayloadサイズ上限256KBを超えた際の挙動を確認してみました。
やってみた
準備
State Machineからs3:GetObject
APIを叩いてオブジェクトを取得することにより挙動を確認します。
取得対象のオブジェクトとして、データサイズが256KBを超えるファイルと超えないファイルの2つをS3 Bucketにアップロードします。
#ファイルのアップロード bucket=<BucketName> aws s3 cp over256KB.jsonl s3://${bucket} aws s3 cp under256KB.jsonl s3://${bucket}
アップロードできました。一方のファイルが262,144 bytes以上、もう一方が以下のサイズとなっています。
$ aws s3api list-objects-v2 --bucket ${bucket} { "Contents": [ { "Key": "over256KB.jsonl", "LastModified": "2022-06-26T14:45:42+00:00", "ETag": "\"de04f000069ba9edfeb6d1e61986482f\"", "Size": 264255, "StorageClass": "STANDARD" }, { "Key": "under256KB.jsonl", "LastModified": "2022-06-26T14:46:02+00:00", "ETag": "\"f56bf65eaabb30ae32d9506b0f63a888\"", "Size": 258680, "StorageClass": "STANDARD" } ] }
ちなみにファイルの内容はいずれもこんな感じのJSON Linesです。
AWS CDK v2(TypeScript)で次のようなCDKスタックを作成します。
import { Construct } from 'constructs'; import { aws_s3, aws_stepfunctions, aws_stepfunctions_tasks, RemovalPolicy, Stack, StackProps, } from 'aws-cdk-lib'; export class ProcessStack extends Stack { constructor(scope: Construct, id: string, props: StackProps) { super(scope, id, props); // S3 Bucket const s3Bucket = new aws_s3.Bucket(this, 'dataBucket', { removalPolicy: RemovalPolicy.DESTROY, }); // Get Object1 const getObjectTask1 = new aws_stepfunctions_tasks.CallAwsService( this, 'getObjectTask1', { service: 's3', action: 'getObject', parameters: { Bucket: s3Bucket.bucketName, Key: aws_stepfunctions.JsonPath.stringAt('$.key1'), }, iamResources: [`${s3Bucket.bucketArn}/*`], iamAction: 's3:GetObject', resultPath: '$.getObjectTask1', }, ); // State Machine new aws_stepfunctions.StateMachine(this, 'stateMachine', { stateMachineName: 'stateMachine', definition: getObjectTask1, }); } }
上記をCDK Deployしてスタックをデプロイします。
取得したデータのサイズが256KB以下の場合
次の入力を指定してステートマシンを実行します。これによりデータサイズが256KB以下のオブジェクトを取得します。
{ "key1": "under256KB.jsonl" }
すると実行が成功しました。オブジェクトの内容が取得できています!
取得したデータのサイズが256KB以上の場合
次の入力を指定してステートマシンを実行します。これによりデータサイズが256KB以上のオブジェクトを取得します。
{ "key1": "over256KB.jsonl" }
するとサービスリミットの最大値をaws-sdk:s3
のReturnサイズが超過している旨のエラーが出て実行が失敗しました。想定通りの動作です!
The state/task 'aws-sdk:s3' returned a result with a size exceeding the maximum number of bytes service limit.
256KB以下のデータを取得した結果、Payloadが256KBを超えた場合
次の入力を指定してステートマシンを実行します。s3:getObject
のタスクの前に既にPayloadがある程度のサイズとなっている想定です。
{ "key1": "under256KB.jsonl", "existing": 12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890 }
するとs3:getObject
自体は成功しましたが、State Machineの実行は失敗しました。こちらも想定通りの動作です!
The state/task 'getObjectTask1' returned a result with a size exceeding the maximum number of bytes service limit.
おわりに
AWS Step FunctionsでPayloadサイズ上限256KBを超えた際の挙動を確認してみました。
期待通りの結果となって良かったです。
以上